/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.Cie9mcFisica;
import hibernate.objeto.Cie9mc;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import java.util.Vector;
import presentacion.utilidad.MensajePresentacion;

/**
 *
 * @author Gonzalo
 */
public class Cie9mcLogica extends CapaLogica {

    /**
     * Crea y persiste la enfermedad Cie9mc.
     *
     * @param datosCie9mc Los datos de la enfermedad
     * @param cie9mc El objeto a guardar, pueder ser vacio en caso de que
     * se trate de un alta o, una completa en caso de modificación
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarCie9mc(String[] datosCie9mc,
            Cie9mc cie9mc) {
        //Crea el objeto
        cie9mc = crearUObtenerObjetoCie9mc(datosCie9mc, cie9mc);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(cie9mc)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Elimina logicamente una enfermedad Cie9mc de la base de datos.
     *
     * @param cie9mc La enfermedad a eliminar
     * @return true si se eliminó correctamente, false en caso contrario
     */
    public static boolean eliminarCie9mc(Cie9mc cie9mc) {
        if (esCie9mcLibre(cie9mc)) {
            //Setea activo
            cie9mc.setEnBdCie9mc(false);

            //Guarda en la base de datos
            return CapaFisica.guardarOActualizarObjeto(cie9mc);
        } else {
            MensajePresentacion.informarImposibilidadEliminarEnfermedad();
            return false;
        }
    }

    /**
     * Crea u obtiene un objeto cie9mc con los datos pasados por parámetro.
     *
     * @param datosCie9mc Los datos de la enfermedad
     * @param cie9mc El objeto a guardar, pueder ser vacio en caso de que
     * se trate de un alta o, una completa en caso de modificación
     * @return El objeto Cie9mc creado
     */
    private static Cie9mc crearUObtenerObjetoCie9mc(
            String[] datosCie9mc, Cie9mc cie9mc) {
        //Alta
        if (cie9mc.getDetalleCie9mc() == null) {
            //Primero verifica si existió antes
            cie9mc = getCie9mcPorNombreYPorEnBd(
                    datosCie9mc[CIE9MC_NOMBRE], false);

            //Si nunca existió, la creo
            if (cie9mc == null) {
                cie9mc = new Cie9mc();
                //Setea el codigo
                String codigoUsuario = generarCodigoUsuario();
                cie9mc.setCodigoCie9mc(codigoUsuario);
            }
        }

        cie9mc.setDetalleCie9mc(
                datosCie9mc[CIE9MC_NOMBRE].toUpperCase());

        cie9mc.setClasificacionCie9mc(
                datosCie9mc[CIE9MC_CLASIFICACION]);

        cie9mc.setAreaCie9mc(datosCie9mc[CIE9MC_AREA]);

        cie9mc.setEnBdCie9mc(true);

        return cie9mc;
    }

    /**
     * Retorna el vector de objetos Cie9mc que han sudo cargados por el usuario.
     *
     * @return El vector de objetos Cie9mc, null si no existe
     */
    public static Vector<Cie9mc> getVectorCie9mcAgregados() {
        return Cie9mcFisica.getVectorCie9mcAgregados();
    }
    
    /**
     * Retorna el objeto Cie9mc según el código de la enfermedad.
     *
     * @param codigo El código de la enfermedad
     * @return El objeto Cie9mc consultado, null si no existe
     */
    public static Cie9mc getCie9mcPorCodigo(String codigo) {
        return Cie9mcFisica.getCie9mcPorCodigo(codigo);
    }

    /**
     * Retorna el vector con los objetos Cie9mc según el código de la enfermedad.
     *
     * @param codigo El código de la enfermedad
     * @return El vector de objetos Cie9mc consultado, null si no existe
     */
    public static Vector<Cie9mc> getVectorCie9mcPorCodigoYEnBd(String codigo) {
        return Cie9mcFisica.getVectorCie9mcPorCodigoYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(codigo));
    }

    /**
     * Retorna el vector con los objetos Cie9mc según el nombre de la enfermedad.
     *
     * @param nombre El nombre de la enfermedad
     * @return El vector de objetos Cie9mc consultado, null si no existe
     */
    public static Vector<Cie9mc> getVectorCie9mcPorNombreYEnBd(String nombre) {
        return Cie9mcFisica.getVectorCie9mcPorNombreYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(nombre));
    }

    /**
     * Retorna el objeto Cie9mc según el nombre y el estado.
     *
     * @param nombreCie9mc El nombre de la enfermedad
     * @param estado false si es baja lógica, true si aún activo
     * @return El objeto Cie9mc consultado , null si no existe
     */
    public static Cie9mc getCie9mcPorNombreYPorEnBd(
            String nombreCie9mc, boolean estado) {
        return Cie9mcFisica.getCie9mcPorNombreYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(nombreCie9mc), estado);
    }

    /**
     * Retorna todas los objetos Cie9mc asociados a un paciente.
     *
     * @param idPaciente El paciente a consultar
     * @return El vector de objetos Cie9mc asociados al paciente, null si no
     * contiene
     */
    public static Vector<Cie9mc> getVectorCie9mcPorIdPaciente(int idPaciente) {
        Vector<EnfermedadYDiagnosticoAmbulatorio>
                vectorEnfermedadYDiagnosticoAmbulatorio =
                EnfermedadYDiagnosticoAmbulatorioLogica.
                getVectorEnfermedadYDiagnosticoAmbulatorioPorIdPaciente(idPaciente);

        Vector<DiagnosticoYTriageInternacion> vectorDiagnosticoYTriageInternacion =
                DiagnosticoYTriageInternacionLogica.
                getVectorDiagnosticoYTriageInternacionPorIdPaciente(idPaciente);

        Vector<Cie9mc> vectorCie9mcAmbulatorio = new Vector();
        if (vectorEnfermedadYDiagnosticoAmbulatorio != null) {
            for (int i = 0; i < vectorEnfermedadYDiagnosticoAmbulatorio.size(); i++) {
                vectorCie9mcAmbulatorio.add(
                        vectorEnfermedadYDiagnosticoAmbulatorio.get(i).getCie9mc());
            }
        }

        Vector<Cie9mc> vectorCie9mcInternacion = new Vector();
        if (vectorDiagnosticoYTriageInternacion != null) {
            for (int i = 0; i < vectorDiagnosticoYTriageInternacion.size(); i++) {
                if (vectorDiagnosticoYTriageInternacion.get(i).
                        getEpicrisisInternacion() != null) {
                    vectorCie9mcInternacion.add(
                            vectorDiagnosticoYTriageInternacion.get(i).
                            getEpicrisisInternacion().getCie9mc());
                }
            }
        }

        return unirVectores(vectorCie9mcAmbulatorio, vectorCie9mcInternacion);
    }

    /**
     * Verifica si la enfermedad ya se encuentra cargado en la base de datos.
     *
     * @param nombreCie9mc El detalle de la enfermedad consultada
     * @param estado false si es baja lógica, true si aún activo
     * @return true si existe, false en caso contrario
     */
    public static boolean existeCie9mcPorNombreYPorEnBd(
            String nombreCie9mc, boolean estado) {
        return getCie9mcPorNombreYPorEnBd(
                reemplazarUnApostrofoPorDosApostrofos(nombreCie9mc), estado) != null;
    }

    /**
     * Retorna un código de usuario para ser asignado a una nueva enfermedad.
     *
     * @return El String código con el formato "user.0000"
     */
    private static String generarCodigoUsuario() {
        String codigo = "USER.";
        int numeroCodigo;

        //Obtengo el último registro activo agregado de la bd
        Cie9mc cie9mcAgregados = getCie9mcAgregadoReciente();

        //Separo el numero identificatorio
        int numeroCodigoAgregado = separarNumeroCodigoCie9mc(cie9mcAgregados);
        numeroCodigo = numeroCodigoAgregado + 1;

        codigo = codigo + (String.valueOf(numeroCodigo));

        return codigo;
    }

    /**
     * Retorna el último objeto Cie9mc activo agregado a la bd
     *
     * @return El objeto Cie9mc consultado, null si no existe
     */
    private static Cie9mc getCie9mcAgregadoReciente() {
        Vector<Cie9mc> vectorCie9mc = getVectorCie9mcAgregados();
        Cie9mc cie9mcReciente = null;
        int ultimoCodigo = -1;

        if (vectorCie9mc != null) {
            for (int i = 0; i < vectorCie9mc.size(); i++) {
                if (separarNumeroCodigoCie9mc(vectorCie9mc.get(i)) > ultimoCodigo) {
                    ultimoCodigo = separarNumeroCodigoCie9mc(vectorCie9mc.get(i));
                    cie9mcReciente = vectorCie9mc.get(i);
                }
            }
        }

        return cie9mcReciente;
    }

    /**
     * Dado un codigo de un objeto Cie9mc verifica si fue agregado por el usuario.
     *
     * @param codigo El codigo del objeto
     * @return true si fue agregado por el usuario, false en caso contrario
     */
    public static boolean esCodigoUsuario(String codigo) {
        String temporal = codigo.substring(0, 2);
        if (temporal.equalsIgnoreCase("us")) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Verifica si alguna entidad esta relacionada al objeto.
     *
     * @param cie9mc el objeto a consultar
     * @return true si está libre, false si esta vinculada
     */
    private static boolean esCie9mcLibre(Cie9mc cie9mc) {
        if (cie9mc.getAntecedenteFamiliars().isEmpty() &&
                cie9mc.getAntecedentePersonals().isEmpty() &&
                cie9mc.getEnfermedadYDiagnosticoAmbulatorios().isEmpty()  &&
                cie9mc.getEpicrisisInternacions().isEmpty()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Retorna todo el objeto Cie9mc en string.
     *
     * @param cie9mc El objeto a escribir
     */
    public static String getCie9mcString(Cie9mc cie9mc) {
        String cie9mcString =
                "codigoCie9mc: " +
                cie9mc.getCodigoCie9mc() + "\n" +
                "detalleCie9mc: " +
                cie9mc.getDetalleCie9mc() + "\n" +
                "clasificacionCie9mc: " +
                cie9mc.getClasificacionCie9mc() + "\n" +
                "areaCie9mc: " +
                cie9mc.getAreaCie9mc() + "\n";

        return cie9mcString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion del cie9mc.
     *
     * @param cie9mc El cie9mc
     * @return El String que contiene el HTML
     */
    public static String getCie9mcHTML(Cie9mc cie9mc) {
        String cie9mcHTML = "";

        if (cie9mc != null) {
        cie9mcHTML =
                "<font size=\"3\" face=\"arial\" color=\"blue\">CIE 9 MC</font><br> " +
                "<font size=\"3\" face=\"arial\" color=\"black\">Código: </font>"
                + "<font size=\"3\" face=\"arial\">" +
                cie9mc.getCodigoCie9mc()+ "</font><br>" +
                "<font size=\"3\" face=\"arial\" color=\"black\">Detalle: </font>"
                + "<font size=\"3\" face=\"arial\">" +
                cie9mc.getDetalleCie9mc() + "</font><br>" +
                "<font size=\"3\" face=\"arial\" color=\"black\">Clasificación: </font>"
                + "<font size=\"3\" face=\"arial\">" +
                cie9mc.getClasificacionCie9mc() + "</font><br>" +
                "<font size=\"3\" face=\"arial\" color=\"black\">Área: </font>"
                + "<font size=\"3\" face=\"arial\">" +
                cie9mc.getAreaCie9mc() + "</font><br>";
        } else {
            cie9mcHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">CIE 9 MC</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }

        return cie9mcHTML;
    }

}
